iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
0
Google Developers Machine Learning

Machine Learning with TensorFlow on Google Cloud Platform系列 第 23

鐵人賽Day23 - Art and Science of Machine Learning (1/6)

  • 分享至 

  • xImage
  •  

The art of ML

主旨:了解ML裡面的藝術如正規化、學習率和批次大小

在這個子課程中我們將學會:

  • 泛化模型
  • 調整學習率和批次大小已達到更好的模型表現
  • 優化模型

正規化(Regularization)

在訓練ML模型的過程中,我們都會監看損失函數值的變化,例如下圖,訓練損失會隨著訓練過程一直下降,然而測試損失卻不是這樣,一開始會先下降,下降到一個程度之後卻開始上升,這時候就是所謂的過擬合(Over-fitting) 的現象發生了,而正規化就是要避免或者減輕過擬合的發生

以下面的例子來看,左下角明明都是橘色的資料,然而模型預測卻出現一小塊藍色的區域,當使用的模型過於複雜、參數太多的時候,就很容易出現這種過擬合的現象

正規化的目的是為了減輕模型的過擬合,而其概念就是懲罰模型的複雜度,一般常用的正規化技巧有:

  • 提前停止 (early stopping)
  • 參數規範懲罰 (parameter norm penalities)
    • L1, L2, max norm
  • 資料擴增 (dataset augmentation)
  • 噪音穩固性 (noise robustness)
  • 稀疏表示 (sparse representation)

損失函數中加入懲罰項,如下圖示,就可以達到泛化的效果:

接著我們介紹 L1-norm 和 L2-norm 的正規化方式,首先是兩個的計算方式:L1-norm 是將參數的絕對值相加,L2-norm 是平方和相加開根號

這種計算方式隱含的意義是將參數值限縮在一個範圍內,L2-norm 是類似一個圓、L1-norm 是類似一塊長方形的概念 (因為參數空間維度可以很高,所以這邊用“類似”這個詞)。

寫成完整數學式子表示的話,L1-norm、L2-norm 加在原本損失函數後面如下面的式子,其中 https://chart.googleapis.com/chart?cht=tx&chl=%5Clambda 是用來調控正規項影響的大小(有的地方稱作 regularization rate),這樣就是使用正規化的方式。

正規化的技巧可以讓我們得到一個泛化較好的模型,而一個泛化良好的模型才能同時在訓練和測試的資料上,表現得一樣好

學習率和批次大小

學習率(Learning rate) 是用來控制優化時,參數空間更新步伐的大小,若學習率太小,那麼訓練就會花很久時間,若學習率太大,訓練就無法收斂。

批次大小(Batch size) 則是用來控制多少樣本資料要被拿來計算梯度,若批次大小太小,那麼訓練時損失函數就會彈跳,若批次大小太大,訓練更新一次參數需要計算量大就比較花費時間。

下面是ML模型部分的 TensorFlow 程式碼,裡面用到的參數如 batch_sizelearning_ratel2_regularization_strength 就是上面我們提到的內容。

另外最下面有用到一個參數 steps,這邊額外來說明一下在ML模型訓練中,常常會講到 epochstep,這兩個東西到底有什麼關聯呢?

epoch 其實是指看過所有訓練資料集的次數,而 step 則是訓練的次數,這兩者會和 batch_size 有關係,舉個簡單的例子:假如:

  • 資料總共有 10,000 筆
  • 批次大小 batch_size=200
  • 若訓練模型的 epoch=1 (看過全部資料集1次)

那麼此時模型會訓練的次數會是 50 次,也就是說 step=50,一般在單一機器上訓練的時候使用 epoch 或 step 都可以,但若是分散式的訓練,就會只使用 step ,而不會用 epoch 了。

最後,在訓練模型的時候,我們通常會將資料洗牌,然後做切分,那為什麼要做“洗牌”的這個動作呢?其實這個步驟的目的是會了讓我們之後取的每個批次,都能夠在某種程度上表示全部資料的行為,若每次批次不夠具有代表性,那麼損失函數就很容易跳來跳去,造成模型收斂速度變慢或甚至是無法收斂。

[GCP Lab實作-17]:藉由手調超參數來增進模型精準度

這個實作中,我們將學會:

  • 在 TensorFlow 中使用 LinearRegressor
  • 使用方均根差 (Root Mean Squared Error, RMSE) 來計算模型預測的準確度

[Part 1]:手調超參數

  1. 登入 GCP,開啟Notebooks後,複製課程 Github repo (如Day9的Part 1 & 2步驟)。

  2. 在左邊的資料夾結構,點進 training-data-analyst > courses > machine_learning > deepdive > 05_artandscience ,然後打開檔案 a_handtuning.ipynb

  3. 先將資料讀進來後,用 head()describe() 看一下資料基本的樣子:

  1. 這次我們建造一個特徵 num_rooms,將全部房間數除上家庭數,作為每個家庭擁有的房間數,並且用這個特徵來預測房價:

  1. 將資料切分成訓練和評估兩種:

  1. 訓練線性迴歸模型,可以看到訓練完的結果,RMSE 約是 234,043 元:

  1. 將房價縮小 100,000 倍後,重新訓練一次,因為過大的值會造成訓練過於偏重那些點,可以看到結果,RMSE 大幅下降至 116,602 元:

  1. 最後來調整超參數 (hyperparameter):學習率和批次大小,我們將學習率改成 0.2,批次大小改成 512,RMSE 些微下降至 114,543 元:

使用不同的超參數和更多的特徵引入,都可以得到不一樣的結果,ML模型的訓練過程就是在這些選擇中,尋找出一個比較好的組合。


今天介紹了正規化、學習率和批次大小,明天我們將介紹 “超參數的調整”。


上一篇
鐵人賽Day22 - Feature Engineering (6/6)
下一篇
鐵人賽Day24 - Art and Science of Machine Learning (2/6)
系列文
Machine Learning with TensorFlow on Google Cloud Platform30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言